package net.suplementos.pojo;

import java.io.Serializable;
import java.util.Set;

import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.SequenceGenerator;

@Entity
@SequenceGenerator(name = "PRODUTO_SEQ", sequenceName = "PRODUTO_SEQ")
public class Produto implements Serializable {

	@Id
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "PRODUTO_SEQ")
	private Integer id;
	private Boolean ativo;
	private String descricao;
	private String nome;
	private Boolean original;
	private double valor;

	@ManyToOne
	private Arquivo arquivo;

	@ManyToOne(fetch = FetchType.EAGER)
	private Categoria categoria;

	@ManyToOne(fetch = FetchType.EAGER)
	private Marca marca;

	@ManyToOne
	@JoinColumn(name = "produto_anterior")
	private Produto produtoPai;

	@OneToOne(mappedBy = "produto", fetch = FetchType.EAGER)
	private Estoque estoque;

	@ManyToMany
	@JoinTable(
	    name = "produto_fornecedor", 
	    joinColumns = {@JoinColumn(name = "produto_id")},
	    inverseJoinColumns = { @JoinColumn(name = "fornecedor_id") 
	})
	private Set<Fornecedor> fornecedores;

	public Produto() {
	}

	public Integer getId() {
		return this.id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public Boolean getAtivo() {
		return this.ativo;
	}

	public void setAtivo(Boolean ativo) {
		this.ativo = ativo;
	}

	public String getDescricao() {
		return this.descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	public String getNome() {
		return this.nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public Boolean getOriginal() {
		return this.original;
	}

	public void setOriginal(Boolean original) {
		this.original = original;
	}

	public double getValor() {
		return this.valor;
	}

	public void setValor(double valor) {
		this.valor = valor;
	}

	public Arquivo getArquivo() {
		return this.arquivo;
	}

	public void setArquivo(Arquivo arquivo) {
		this.arquivo = arquivo;
	}

	public Categoria getCategoria() {
		return this.categoria;
	}

	public void setCategoria(Categoria categoria) {
		this.categoria = categoria;
	}

	public Marca getMarca() {
		return this.marca;
	}

	public void setMarca(Marca marca) {
		this.marca = marca;
	}

	public Produto getProdutoPai() {
		return produtoPai;
	}

	public void setProdutoPai(Produto produtoPai) {
		this.produtoPai = produtoPai;
	}

	public Set<Fornecedor> getFornecedores() {
		return fornecedores;
	}

	public void setFornecedores(Set<Fornecedor> fornecedores) {
		this.fornecedores = fornecedores;
	}

	public Estoque getEstoque() {
		return estoque;
	}

	public void setEstoque(Estoque estoque) {
		this.estoque = estoque;
	}
}